; ********************************************************************************************************************
; * GMCOUT(SETUP,PLAY,TEMPO,TRK1,TRK2)
; ********************************************************************************************************************
FUNCTION	GMCOUT	PRG1,PRG2,PRG3,TRK1,TRK2
REM	; GMCOUT(P1,P2,P3,TRK1,TRK2)
REM	; P1 0=VECTORS   1=MUSIC  2=SFX  P2=PLAYMODE  P3=TEMPO
DEF	PRG1	BYTE
DEF	PRG2	BYTE
DEF	PRG3	BYTE
DEF	TRK1	WORD
DEF	TRK2	WORD
PRG1	FCB	0
PRG2	FCB	0
PRG3	FCB	0
TRK1	FCB	0,0
TRK2	FCB	0,0
INTERUPT	FCB	0,0
MAXVOL	FCB	0	;0=full
MAXSFXVOL	FCB	0	;0=full
VOL1	FCB	0	;volume
VOL2	FCB	0
VOL3	FCB	0
VOL4	FCB	0
SLEN1	FCB	0	;delay length
SLEN2	FCB	0
SLEN3	FCB	0
SLEN4	FCB	0
SCNT1	FCB	0	;delay cnt
SCNT2	FCB	0
SCNT3	FCB	0
SCNT4	FCB	0
CHAN1	FCB	144
CHAN2	FCB	176
CHAN3	FCB	208
CHAN4	FCB	240
	FCB	0
; 1= setup and play as loop will =2 after      3=setup and play once
PLAY	FCB	0	;play the song
PLYSPD	FCB	2	;delay tempo
PLYCNT	FCB	0	;counter
PLYSFXPOS	FCB	0,0	;sfx pos
PLYSFXSTR	FCB	0,0	;sfx start
PLYSFXSPD	FCB	0	;speed
PLYSFXCNT	FCB	0	;delay
PLYSFXLEN	FCB	0
PLYSFXOCT	FCB	3
PLYSFXENC	FCB	0
PLYSFXDEL	FCB	0
PLAYSFX	FCB	0	;run?
PLYPOS1	FCB	0,0
PLYSTR1	FCB	0,0
PLYPOS2	FCB	0,0
PLYSTR2	FCB	0,0
PLYOCT1	FCB	3
PLYLEN1	FCB	0
PLYENC1	FCB	0	;channel 1 delay
PLYDEL1	FCB	0	;pause counter
PLYOCT2	FCB	3
PLYLEN2	FCB	0
PLYENC2	FCB	0	;channel 2 delay
PLYDEL2	FCB	0	;pause counter
TEMPA	FCB	0
TEMPB	FCB	0	;temp data
NOTE	FCB	0,0
#NOMOVE
NOTETB2	FCB	1,2,3,4,6,8,12,16,32
NOTETB1	FCB	9,11,0,2,4,5,7,9
VOLUMETB	FCB	15,14,12,10,8,6,4,2,1,0
;
GMCDAT	FCB	139,59	;2c	24
	FCB	133,56	;2c#	25
	FCB	131,53	;2d	26
	FCB	131,50	;2d#	27
	FCB	134,47	;2e	28
	FCB	139,44	;2f	29
	FCB	131,42	;2f#	30
	FCB	141,39	;2g	31
	FCB	137,37	;2g#	32
	FCB	136,35	;2a	33
	FCB	143,63	;2A#	34
	FCB	132,63	;2b
	FCB	139,59	;2c	24
	FCB	133,56	;2c#	25
	FCB	131,53	;2d	26
	FCB	131,50	;2d#	27
	FCB	134,47	;2e	28
	FCB	139,44	;2f	29
	FCB	131,42	;2f#	30
	FCB	141,39	;2g	31
	FCB	137,37	;2g#	32
	FCB	136,35	;2a	33
	FCB	143,63	;2A#	34
	FCB	132,63	;2b
	FCB	139,59	;3c
	FCB	133,56	;3c#
	FCB	131,53	;3d
	FCB	131,50	;3d#
	FCB	134,47	;3e
	FCB	139,44	;3f
	FCB	131,42	;3f#
	FCB	141,39	;3g
	FCB	137,37	;3g#
	FCB	136,35	;3a
	FCB	136,33	;3a#
	FCB	138,31	;3a
	FCB	141,29
	FCB	130,28
	FCB	137,26
	FCB	129,25
	FCB	139,23
	FCB	133,22
	FCB	129,21
	FCB	142,19
	FCB	140,18
	FCB	140,17
	FCB	140,16
	FCB	141,15
	FCB	142,14
	FCB	129,14
	FCB	132,13
	FCB	136,12
	FCB	141,11
	FCB	130,11
	FCB	136,10
	FCB	143,9
	FCB	134,9
	FCB	142,8
	FCB	134,8
	FCB	142,7
	FCB	135,7
	FCB	128,7
	FCB	138,6
	FCB	132,6
	FCB	142,5
	FCB	137,5
	FCB	132,5
	FCB	143,4
	FCB	139,4
	FCB	135,4
	FCB	131,4
	FCB	143,3
	FCB	139,3
	FCB	136,3
	FCB	133,3
	FCB	130,3
	FCB	143,2
	FCB	140,2
	FCB	138,2
	FCB	135,2
	FCB	133,2
	FCB	131,2
	FCB	129,2
	FCB	143,1
	FCB	141,1
	FCB	140,1
	FCB	138,1
	FCB	137,1
	FCB	135,1
	FCB	134,1
	FCB	133,1
	FCB	131,1
	FCB	130,1
	FCB	129,1
	FCB	128,1
	FCB	143,0	;8b	107
;
#MOVE
GMCOUT	LDA	PRG1
	CMPA	#0
	LBEQ	SETUPVECTORS
	CMPA	#1
	LBEQ	SETUPMUSIC	;SETUP IRQ ONLY ONCE IN YOUR CODE
	CMPA	#2
	LBEQ	SETUPSFX	;SETUP SFX
	RTS
; ****************************************************GMCPLAY INTERUPT *********************************************
GMCPLAY	JSR	SILENCE
	JSR	PLAYMUSIC
	JSR	SFXPLAY
;	LDA	$FF02
;	RTI
	JMP	[INTERUPT]
; ******************************************************SILENCE CHIP***********************************************************
SILENCE	CLRB
LOOPSIL	LDX	#VOL1
	LEAX	B,X
	LDA	8,X	;delay cnt
	BNE	SILEN
	LDA	4,X	;length
	STA	8,X
; lower the volume
	LDA	0,X
	CMPA	#15
	BHS	SILEN
	INC	,X
SILEN	LDA	8,X
	BEQ	SILEN2
	DEC	8,X
SILEN2	LDA	12,X	;chan
	ADDA	,X
	STA	$FF41
	INCB
	CMPB	#4
	BLO	LOOPSIL
	RTS
; ***********************************************************SETUP SFX**************************************************
SETUPSFX	LDX	TRK1
	STX	PLYSFXPOS
	STX	PLYSFXSTR
	LDA	PRG3
	STA	PLYSFXSPD	;SPEED
	CLRA
	STA	PLYSFXCNT
	STA	PLYSFXLEN
	STA	PLYSFXENC
	STA	PLYSFXDEL
	LDA	PRG2
	STA	PLAYSFX
	RTS
; ********************************************SETUP THE MUSIC*********************************************************
SETUPMUSIC	LDX	TRK1
	STX	PLYPOS1
	STX	PLYSTR1
	LDX	TRK2
	STX	PLYPOS2
	STX	PLYSTR2
	LDA	PRG3
	STA	PLYSPD	;PLAYER TEMPO
	STA	PLYCNT	;CLEAR THE COUNTER
	LDA	#3
	STA	PLYOCT1
	STA	PLYOCT2
; clear all vars
	CLRA
	STA	PLYLEN1
	STA	PLYENC1
	STA	PLYDEL1
	STA	PLYLEN2
	STA	PLYENC2
	STA	PLYDEL2
	LDA	PRG2
	STA	PLAY
	RTS
; ****************************************SETUP IRQ VECTORS**********************************************************
SETUPVECTORS	
; basic setup end
	ORCC	#$50
	LDD	$010D
	STD	INTERUPT
	LDX	#GMCPLAY
	STX	$010D
; no mpi setup
	LDA	#159
	STA	$FF41	;channel 0 sound off
	LDA	#176
	STA	$FF41	;channel 1 sound off
	LDA	#208
	STA	$FF41	;channel 2 sound off
	LDA	#240
	STA	$FF41	;channel 3 sound off	
; enable tv
	LDA	$FF23
	ORA	#8
	STA	$FF23
	LDA	$FF03
	ORA	#8
	STA	$FF03
	LDA	$FF01
	ORA	#8
	EORA	#8
	STA	$FF01
; done setup
; lets set play to 0 also
	CLR	PLAY
	CLR	PLAYSFX
	ANDCC	#$EF
	RTS
; ***************************************************PLAY THE MUSIC********************************************************
PLAYMUSIC	LDA	PLAY
	BNE	PLAYM	;check play routine
	RTS	;no music
PLAYM	LDA	PLYCNT
	BEQ	UPPLAY0
	DEC	PLYCNT
	RTS	;not ready to play
;
UPPLAY0	LDA	PLYSPD
	STA	PLYCNT	;delay reset
CHANNEL1	LDA	PLYDEL1
	CMPA	#1
	BLS	UPLP0	;good to go
	DEC	PLYDEL1
	LBRA	CHANNEL2
UPLP0	LDA	PLYENC1
	CMPA	#1
	BLS	UPPLAY00	;good to go
	DEC	PLYENC1
	LBRA	CHANNEL2
UPPLAY00	LDX	PLYPOS1
UPPLAY1	LDA	,X+	;grab command
; process string
	CMPA	#65
	LBLO	NOTMUSIC1
	CMPA	#71
	LBHI	NOTMUSIC1
; ok its a music tone
;
	SUBA	#65	0-11
; no hash tag
	LDY	#NOTETB1	;table for tones
	LEAY	A,Y	;get tone
	LDA	,Y	;tone loaded
; hash tag ?
	LDB	,X	;no advance
	CMPB	#35	;#
	BNE	NOHASH1
	INCA	;has a hash tag
	LEAX	1,X	;advance it
; load octave with it
NOHASH1	CMPB	#45
	BNE	NODECH1
	DECA	;has a -
	LEAX	1,X	;move player
NODECH1	STA	NOTE
	LDA	#12
	LDB	PLYOCT1
	SUBB	#2
	MUL
	LDY	#GMCDAT
	LEAY	D,Y
	LEAY	D,Y
; ok set the note
	LDA	NOTE
	LEAY	A,Y
	LEAY	A,Y	;twice
	LDA	,Y+
;	ORA	#32	;chan 1
	STA	$FF41
	NOP
	NOP
	NOP
	NOP
	LDA	,Y
	STA	$FF41	;tone set
	NOP
	NOP
	NOP
	NOP
	LDA	MAXVOL
	STA	VOL1
	LDA	PLYLEN1
	STA	PLYENC1	;counter set
	LSRA
	STA	SLEN1	;smooth sound delay
	STA	SCNT1	;counter set
	LDA	#144
	ADDA	VOL1
	STA	$FF41	;volume set
	STX	PLYPOS1	;save position
	LBRA	CHANNEL2
; exit
;
;
NOTMUSIC1	CMPA	#0	
	BNE	CHKCMD1
	LDA	PLAY
	CMPA	#2
	BNE	KILLPLAY1
	LDX	PLYSTR1
	STX	PLYPOS1	;reset song chan 1 only
	LBRA	UPPLAY1
KILLPLAY1	CLR	PLAY
	LDX	PLYSTR1
	STX	PLYPOS1
	LDX	PLYSTR2
	STX	PLYPOS2
	RTS	;exit only play once actual exit
CHKCMD1	CMPA	#79	;o octave change
	BEQ	OCTCH1
	CMPA	#76	;length change
	BEQ	LENCH1
	CMPA	#80	;pause
	BEQ	PAUSE1
	CMPA	#72	;h
	BEQ	GMCTAT1
	CMPA	#86	;volume
	BEQ	VOLUMECH1
	LBRA	UPPLAY1	;not those commands
;
VOLUMECH1	LDA	,X+
	SUBA	#48
	LDY	#VOLUMETB
	LEAY	A,Y	;boom faster
	LDA	,Y
	STA	MAXVOL
	LBRA	UPPLAY1
;
; set octave channel 1
OCTCH1	LDA	,X+
	SUBA	#48	;asc 0
	STA	PLYOCT1
	LBRA	UPPLAY1
;
; set length channel 1
LENCH1	LDA	,X+
	SUBA	#48
	LDY	#NOTETB2
	LEAY	A,Y	;boom faster
	LDA	,Y
	STA	PLYLEN1
	LBRA	UPPLAY1
;
; set pause channel 1
PAUSE1	LDA	,X+
	SUBA	#48
	LDY	#NOTETB2
	LEAY	A,Y	;boom faster
	LDA	,Y
	STA	PLYDEL1
	STX	PLYPOS1
	LBRA	CHANNEL2	;no more data
;
GMCTAT1	LDA	PLAYSFX
	BNE	NOTATA1
	LDA	MAXVOL
	STA	VOL4
	LDA	#240	;volume latch
	ADDA	VOL4
	STA	$FF41	;
	LDA	,X+
	SUBA	#48
	CMPA	#1
	BNE	GMCLOW1
	CLR	SLEN4
	CLR	SCNT4
	LDA	#230
	STA	$FF41	;set possibly?
	LBRA	UPPLAY1
GMCLOW1	CLR	SLEN4
	CLR	SCNT4
	LDA	#228
	STA	$FF41
	LBRA	UPPLAY1
NOTATA1	LDA	,X+
	LBRA	UPPLAY1
;
;
;
CHANNEL2	LDA	PLYDEL2
	CMPA	#1
	BLS	UPLP2	;good to go
	DEC	PLYDEL2
	RTS	;is paused
UPLP2	LDA	PLYENC2
	CMPA	#1
	BLS	UPPLAY02	;good to go
	DEC	PLYENC2
	RTS	;not ready
UPPLAY02	LDX	PLYPOS2
UPPLAY2	LDA	,X+	;grab command
; process string
	CMPA	#65
	BLO	NOTMUSIC2
	CMPA	#71
	BHI	NOTMUSIC2
; ok its a music tone
;
	SUBA	#65	0-11
; no hash tag
	LDY	#NOTETB1	;table for tones
	LEAY	A,Y	;get tone
	LDA	,Y	;tone loaded
; hash tag ?
	LDB	,X	;no advance
	CMPB	#35	;#
	BNE	NOHASH2
	INCA	;has a hash tag
	LEAX	1,X	;advance it
; load octave with it
NOHASH2	CMPB	#45
	BNE	NODECH2
	DECA	;has a -
	LEAX	1,X	;move player
NODECH2	STA	NOTE
	LDA	#12
	LDB	PLYOCT2
	SUBB	#2
	MUL
	LDY	#GMCDAT
	LEAY	D,Y
	LEAY	D,Y
; ok set the note
	LDA	NOTE
	LEAY	A,Y
	LEAY	A,Y	;twice
	LDA	,Y+
	ORA	#32	;chan 2
	STA	$FF41
	NOP
	NOP
	NOP
	NOP
	LDA	,Y
	STA	$FF41	;tone set
	NOP
	NOP
	NOP
	NOP
	LDA	MAXVOL
	STA	VOL2
	LDA	PLYLEN2
	STA	PLYENC2	;counter set
	LSRA
	STA	SLEN2	;smooth sound delay
	STA	SCNT2	;counter set
	LDA	#176
	ADDA	VOL2
	STA	$FF41	;volume set
	STX	PLYPOS2	;save position
	RTS	;return for now
; exit
;
;
NOTMUSIC2	CMPA	#0
	BNE	CHKCMD2
	LDX	PLYSTR2
	STX	PLYPOS2	;reset song
	LBRA	UPPLAY2
CHKCMD2	CMPA	#79	;o octave change
	BEQ	OCTCH2
	CMPA	#76	;length change
	BEQ	LENCH2
	CMPA	#80	;pause
	BEQ	PAUSE2
	CMPA	#72	;h
	BEQ	GMCTAT2
	CMPA	#86	;volume
	BEQ	VOLUMECH2
	LBRA	UPPLAY2	;not those commands
;
VOLUMECH2	LDA	,X+
	SUBA	#48
	LDY	#VOLUMETB
	LEAY	A,Y	;boom faster
	LDA	,Y
	STA	MAXVOL
	LBRA	UPPLAY2
;
; set octave channel 1
OCTCH2	LDA	,X+
	SUBA	#48	;asc 0
	STA	PLYOCT2
	LBRA	UPPLAY2
;
; set length channel 1
LENCH2	LDA	,X+
	SUBA	#48
	LDY	#NOTETB2
	LEAY	A,Y	;boom faster
	LDA	,Y
	STA	PLYLEN2
	LBRA	UPPLAY2
;
; set pause channel 1
PAUSE2	LDA	,X+
	SUBA	#48
	LDY	#NOTETB2
	LEAY	A,Y	;boom faster
	LDA	,Y
	STA	PLYDEL2
	STX	PLYPOS2
	RTS	;no more data
;
GMCTAT2	LDB	PLAYSFX
	BNE	NOTATA2
	LDA	MAXVOL
	STA	VOL4
	LDA	#240	;volume latch
	ADDA	VOL4
	STA	$FF41	;
	LDA	,X+
	SUBA	#48
	CMPA	#1
	BNE	GMCLOW2
	CLR	SLEN4
	CLR	SCNT4
	LDA	#230
	STA	$FF41	;set possibly?
	LBRA	UPPLAY2
GMCLOW2	CLR	SLEN4
	CLR	SCNT4
	LDA	#228
	STA	$FF41
	LBRA	UPPLAY2
NOTATA2	LDA	,X+
	LBRA	UPPLAY2
; ********************************************************SFX PLAYER ***********************************************************
SFXPLAY	LDA	PLAYSFX
	BNE	PLAYSN	;check play routine
	RTS	;no music
PLAYSN	LDA	PLYSFXCNT
	BEQ	UPPLAY9
	DEC	PLYSFXCNT
	RTS	;not ready to play
;
UPPLAY9	LDA	PLYSFXSPD
	STA	PLYSFXCNT	;delay reset
CHANNEL9	LDA	PLYSFXDEL
	CMPA	#1
	BLS	UPLP9	;good to go
	DEC	PLYSFXDEL
	RTS
UPLP9	LDA	PLYSFXENC
	CMPA	#1
	BLS	UPPLAY09	;good to go
	DEC	PLYSFXENC
	RTS
UPPLAY09	LDX	PLYSFXPOS
UPPLAYY9	LDA	,X+	;grab command
; process string
	CMPA	#65
	BLO	NOTMUSIC9
	CMPA	#71
	BHI	NOTMUSIC9
; ok its a music tone
;
	SUBA	#65	0-11
; no hash tag
	LDY	#NOTETB1	;table for tones
	LEAY	A,Y	;get tone
	LDA	,Y	;tone loaded
; hash tag ?
	LDB	,X	;no advance
	CMPB	#35	;#
	BNE	NOHASH9
	INCA	;has a hash tag
	LEAX	1,X	;advance it
; load octave with it
NOHASH9	CMPB	#45
	BNE	NODECH9
	DECA	;has a -
	LEAX	1,X	;move player
NODECH9	STA	NOTE
	LDA	#12
	LDB	PLYSFXOCT
	SUBB	#2
	MUL
	LDY	#GMCDAT
	LEAY	D,Y
	LEAY	D,Y
; ok set the note
	LDA	NOTE
	LEAY	A,Y
	LEAY	A,Y	;twice
	LDA	,Y+
	ORA	#64	;chan 3
	STA	$FF41
	NOP
	NOP
	NOP
	NOP
	LDA	,Y
	STA	$FF41	;tone set
	NOP
	NOP
	NOP
	NOP
	LDA	MAXSFXVOL
	STA	VOL3
	LDA	PLYSFXLEN
	STA	PLYSFXENC	;counter set
	LSRA
	STA	SLEN3	;smooth sound delay
	STA	SCNT3	;counter set
	LDA	#208
	ADDA	VOL3
	STA	$FF41	;volume set
	STX	PLYSFXPOS	;save position
	RTS
NOTMUSIC9	CMPA	#0	
	BNE	CHKCMD9
	LDA	PLAYSFX
	CMPA	#2
	BNE	KILLPLAY9
	LDX	PLYSFXSTR
	STX	PLYSFXPOS	;reset song chan 1 only
	LBRA	UPPLAYY9
KILLPLAY9	CLR	PLAYSFX
	LDX	PLYSFXSTR
	STX	PLYSFXPOS
	RTS	;exit only play once actual exit
CHKCMD9	CMPA	#79	;o octave change
	BEQ	OCTCH9
	CMPA	#76	;length change
	BEQ	LENCH9
	CMPA	#80	;pause
	BEQ	PAUSE9
	CMPA	#72	;h
	BEQ	GMCTAT9
	CMPA	#86	;volume
	BEQ	VOLUMECH9
	LBRA	UPPLAYY9
;
VOLUMECH9	LDA	,X+
	SUBA	#48
	LDY	#VOLUMETB
	LEAY	A,Y	;boom faster
	LDA	,Y
	STA	MAXSFXVOL
	LBRA	UPPLAYY9
;
; set octave channel 1
OCTCH9	LDA	,X+
	SUBA	#48	;asc 0
	STA	PLYSFXOCT
	LBRA	UPPLAYY9
;
; set length channel 1
LENCH9	LDA	,X+
	SUBA	#48
	LDY	#NOTETB2
	LEAY	A,Y	;boom faster
	LDA	,Y
	STA	PLYSFXLEN
	LBRA	UPPLAYY9
;
; set pause channel 1
PAUSE9	LDA	,X+
	SUBA	#48
	LDY	#NOTETB2
	LEAY	A,Y	;boom faster
	LDA	,Y
	STA	PLYSFXDEL
	STX	PLYSFXPOS
	RTS	;no more data
;
GMCTAT9	LDA	MAXSFXVOL
	STA	VOL4
	LDA	#240	;volume latch
	ADDA	VOL4
	STA	$FF41	;
	LDA	,X+
	SUBA	#48
	CMPA	#1
	BNE	GMCLOW9
	CLR	SLEN4
	CLR	SCNT4
	LDA	#230
	STA	$FF41	;set possibly?
	LBRA	UPPLAYY9
GMCLOW9	CLR	SLEN4
	CLR	SCNT4
	LDA	#228
	STA	$FF41
	LBRA	UPPLAYY9
ENDFUNCTION
